package com.example.chapter5;

import com.example.chapter5.dao.MyBatisUserDao;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.mybatis.spring.mapper.MapperFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.stereotype.Repository;
//这里使用的＠EnableJpaRepositories 启用 JPA 和制定扫描的包， 这样 Spring 就会将对应的 JPA 接
//口扫描进来，并且生成对应的 Bean ， 装配在 IoC 容器中，这样就可以在控制器上用＠Autowired 进行
//依赖注入了 。 而通过定义＠EntityScan 定义的包扫描，就可以通过扫描装载 JPA 的实体类 了 。 而实际
//上， ~p 使没有使用注解＠EnableJpaRepositories 和＠EntityScan ， 只要依赖了 spring-boot-starter”data才 pa,
//Spring Boot 2.x 也会对项目进行扫描，这样 JPA 的实体和接口都会被扫描 ，只是使用它们可 以更进一
//步配置 JPA 的相关信息而己 。

@SpringBootApplication(scanBasePackages = {"com.example.chapter5"})
@EnableJpaRepositories(basePackages = "com.example.chapter5.dao")
@EntityScan(basePackages = "com.example.chapter5.pojo")
@MapperScan(basePackages = "com.example.chapter5", annotationClass = Repository.class)
public class Chapter5Application {

    public static void main(String[] args) {
        SpringApplication.run(Chapter5Application.class, args);
    }

    @Autowired
    private SqlSessionFactory sqlSessionFactory = null;

    public MapperFactoryBean<MyBatisUserDao> initMyBatisUserDao(){
        MapperFactoryBean<MyBatisUserDao> bean = new MapperFactoryBean<>();
        bean.setMapperInterface(MyBatisUserDao.class);
        bean.setSqlSessionFactory(sqlSessionFactory);
        return bean;
    }

    	/***
	 * 配置MyBatis接口扫描
	 * @return 返回扫描器
	 */
	@Bean
	public MapperScannerConfigurer mapperScannerConfig() {
	    // 定义扫描器实例
	MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();
	    // 加载SqlSessionFactory,Spring Boot会自动生产，SqlSessionFactory实例
	   mapperScannerConfigurer.setSqlSessionFactoryBeanName("sqlSessionFactory");
	    //定义扫描的包
	    mapperScannerConfigurer.setBasePackage("com.example.chapter5.*");
	    //限定被标注@Repository的接口才被扫描
	    mapperScannerConfigurer.setAnnotationClass(Repository.class);
	    //通过继承某个接口限制扫描，一般使用不多
	    //mapperScannerConfigurer.setMarkerInterface(......);
	    return mapperScannerConfigurer;
	}
}
